/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.handler;

import java.sql.SQLException;
import java.util.LinkedList;
import model.dao.PragaDoencaDAO;
import model.dto.PragaDoencaDTO;
import model.exception.MissingIdException;
import model.exception.NoChangesOnUpdateException;
import model.exception.NotNullFieldsException;

/**
 *
 * @author Gabriel
 */
public class PragaDoencaHandler {

    private PragaDoencaDAO pragaDoencaDAO;

    public PragaDoencaHandler() throws SQLException, ClassNotFoundException {
        pragaDoencaDAO = new PragaDoencaDAO();
    }

    private void verificaCamposNotNullInsercao(PragaDoencaDTO pragaDoencaDTO) throws NotNullFieldsException {
        if (pragaDoencaDTO.getFlgPragaDoenca() == null) {
            throw new NotNullFieldsException("O Flag Indicador de Praga ou Doença é informação obrigatória em uma Praga/Doença");
        }

        if (pragaDoencaDTO.getFlgAlvo() == null) {
            throw new NotNullFieldsException("O Flag Indicador do Alvo é informação obrigatória de uma Praga/Doença");
        }

        if (pragaDoencaDTO.getNomeVulgar() == null) {
            throw new NotNullFieldsException("O Nome Vulgar é informação obrigatória de uma Praga/Doença");
        }

        if (pragaDoencaDTO.getNomeCientifico() == null) {
            throw new NotNullFieldsException("O Nome Científico é informação obrigatória de uma Praga/Doença");
        }

        if (pragaDoencaDTO.getAgenteCausador() == null) {
            throw new NotNullFieldsException("O Agente Causador é informação obrigatória de uma Praga/Doença");
        }

        if (pragaDoencaDTO.getSintomas() == null) {
            throw new NotNullFieldsException("Os Sintomas são informações obrigatórias de uma Praga/Doença");
        }
    }

    public void verificaCamposNotNullAtualizacao(PragaDoencaDTO pragaDoencaDTO,
                                            boolean atualizaFlgPragaDoenca,
                                            boolean atualizaFlgAlvo,
                                            boolean atualizaNomeVulgar,
                                            boolean atualizaNomeCientifico,
                                            boolean atualizaAgenteCausador,
                                            boolean atualizaSintomas,
                                            boolean atualizaTratamento) throws NotNullFieldsException {

        if ((pragaDoencaDTO.getFlgPragaDoenca() == null) && atualizaFlgPragaDoenca) {
            throw new NotNullFieldsException("O Flag Indicador de Praga ou Doença é informação obrigatória em uma Praga/Doença");
        }

        if ((pragaDoencaDTO.getFlgAlvo() == null) && atualizaFlgAlvo) {
            throw new NotNullFieldsException("O Flag Indicador do Alvo é informação obrigatória de uma Praga/Doença");
        }

        if ((pragaDoencaDTO.getNomeVulgar() == null) && atualizaNomeVulgar) {
            throw new NotNullFieldsException("O Nome Vulgar é informação obrigatória de uma Praga/Doença");
        }

        if ((pragaDoencaDTO.getNomeCientifico() == null) && atualizaNomeCientifico) {
            throw new NotNullFieldsException("O Nome Científico é informação obrigatória de uma Praga/Doença");
        }

        if ((pragaDoencaDTO.getAgenteCausador() == null) && atualizaAgenteCausador) {
            throw new NotNullFieldsException("O Agente Causador é informação obrigatória de uma Praga/Doença");
        }

        if ((pragaDoencaDTO.getSintomas() == null) && atualizaSintomas) {
            throw new NotNullFieldsException("Os Sintomas são informações obrigatórias de uma Praga/Doença");
        }

    }

    public LinkedList<PragaDoencaDTO> getTodasPragasDoencas() throws SQLException {
        return pragaDoencaDAO.getTodasPragasDoencas();
    }

    public LinkedList<PragaDoencaDTO> pesquisaPragaDoenca(Integer id,
            String nomeVulgar,
            String nomeCientifico,
            String agenteCausador,
            String sintomas,
            String tratamento) throws SQLException {
        return pragaDoencaDAO.pesquisaPragaDoenca(id, nomeVulgar, nomeCientifico, agenteCausador, sintomas, tratamento);

    }

    public void cadastraPragaDoenca(PragaDoencaDTO pragaDoencaDTO) throws NotNullFieldsException, SQLException {
        verificaCamposNotNullInsercao(pragaDoencaDTO);
        pragaDoencaDAO.inserePragaDoenca(pragaDoencaDTO);
    }

    public void atualizaPragaDoenca(PragaDoencaDTO pragaDoencaDTO,
            boolean atualizaFlgPragaDoenca,
            boolean atualizaFlgAlvo,
            boolean atualizaNomeVulgar,
            boolean atualizaNomeCientifico,
            boolean atualizaAgenteCausador,
            boolean atualizaSintomas,
            boolean atualizaTratamento) throws MissingIdException, NotNullFieldsException, NoChangesOnUpdateException, SQLException {

        // Verifica se o identificador foi passado
        if (pragaDoencaDTO.getId() == null) {
            throw new MissingIdException();
        }

        verificaCamposNotNullAtualizacao(pragaDoencaDTO, atualizaFlgPragaDoenca, atualizaFlgAlvo, atualizaNomeVulgar, atualizaNomeCientifico, atualizaAgenteCausador, atualizaSintomas, atualizaTratamento);

        if (!(atualizaFlgPragaDoenca || atualizaFlgAlvo || atualizaNomeVulgar || atualizaNomeCientifico || atualizaAgenteCausador || atualizaSintomas || atualizaTratamento)) {
            throw new NoChangesOnUpdateException();
        }

        pragaDoencaDAO.atualizaPragaDoenca(pragaDoencaDTO, atualizaFlgPragaDoenca, atualizaFlgAlvo, atualizaNomeVulgar, atualizaNomeCientifico, atualizaAgenteCausador, atualizaSintomas, atualizaTratamento);
    }
}
